﻿using CleanToolkit.Comparison.DiffModel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml.Linq;

namespace CleanToolkit.Comparison.Comparers
{
    public class FieldsAttributesComparer : IFieldsComparer
    {
        /// <summary>
        /// Retourne l'ensemble des attributs 
        /// * présents dans l'élément d'origine et absents dans l'élément de comparaison
        /// * présents dans les 2 éléments mais avec des valeurs différentes
        /// </summary>
        /// <param name="orgElt"></param>
        /// <param name="compElt"></param>
        /// <returns></returns>
        public IEnumerable<FieldDiffInfo> Compare(XElement orgElt, XElement compElt)
        {
            // Préparation de la structure de retour
            List<FieldDiffInfo> result = new List<FieldDiffInfo>();
            //-------------------------------------------------------------------------------


            // On itère sur les attributs du SPField d'origine
            // ==> On effectue la comparaison au regard des champs d'ORIGINE à la recherche d'attributs manquants ou différents
            foreach (XAttribute attr in orgElt.Attributes())
            {
                // On récupère l'attribut ayant le même nom dans le SPField de comparaison
                XAttribute compAttr = compElt.Attribute(attr.Name);
                if (compAttr == null)
                {
                    // l'attribut est absent de l'élément de comparaison
                    result.Add(new AttributeMissing()
                        {
                            Name = attr.Name.LocalName,      // Nom de l'attribut
                            Value = attr.Value
                        });
                }
                else
                {
                    if (compAttr.Value != attr.Value)
                    {
                        // les valeurs des attributs  diffèrent
                        result.Add(new AttributeValueDiff()
                            {
                                Name = attr.Name.LocalName, // Nom de l'attribut
                                Source = attr.Value,        // Valeur de l'attribut source
                                Comparison = compAttr.Value // Valeur de l'attribut de destination
                            });
                    }
                }
            }

            // On itère sur les attributs du SPField de comparaiton
            // ==> On effectue la comparaison au regard des champs de DESTINATION à la recherche d'attributs manquants, les différences ayant été levées précédemment
            foreach (XAttribute attr in compElt.Attributes())
            {
                // On récupère l'attribut ayant le même nom dans le SPField de comparaison
                XAttribute orgAttr = orgElt.Attribute(attr.Name);
                if (orgAttr == null)
                {
                    // l'attribut est absent de l'élément de comparaison
                    result.Add(new SourceAttributeMissing()
                    {
                        Name = attr.Name.LocalName,      // Nom de l'attribut
                        Value = attr.Value
                    });
                }
            }




            //-------------------------------------------------------------------------------
            return result;
        }
    }
}
